/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.controller;

import com.context.AppContext;
import com.context.conexion.EnahoConexion;
import com.context.properties.EnahoProperties;
import util.controller.Accion;
import com.controller.exception.UsuarioException;
import com.controller.http.SesionEnaho;
import com.controller.servlet.DispatcherExcelServlet;
import com.model.domain.persona.Personal;
import com.model.domain.usuario.EstadoUsuario;
import com.model.domain.usuario.Perfil;
import util.log.MiLogger;
import com.model.domain.usuario.Usuario;
import com.model.domain.usuario.opciones.OpcionTransferenciaEnvio;
import com.model.domain.usuario.opciones.OpcionTransferenciaMonitoreo;
import com.model.domain.usuario.opciones.OpcionTransferenciaReporte;
import com.model.service.UsuarioService;
import java.io.IOException;
import java.sql.Connection;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import util.usuario.seguridad.Opcion;
import util.www.jsp.JspUtil;

/**
 *
 * @author rdelacruz
 */
public class UsuarioController 
extends AbstractController
{
    //private static final int TIEMPO_LIMITE_SESION = 10;//En minutos
    private static final int TIEMPO_LIMITE_SESION = 20;//En minutos
    
    public UsuarioController() {
        //System.out.println("CREANDO UsuarioController()");
    }
    
    public void welcome(HttpServletRequest request, HttpServletResponse response) throws Exception {
        EnahoProperties enaho;
        Connection con = null;    
        try {
            con = EnahoConexion.getConexion();
            AppContext app = AppContext.getInstancia();
            enaho = app.getEnahoProperties(con);
        }
        finally {
            if(con!=null) con.close();
        }
        
        SesionEnaho ses = new SesionEnaho(request);        
        ses.setAnho(enaho.getAnho());

        //request.setAttribute("mensaje", "Bienvenido al Sistema.");
        request.setAttribute("anho", ses.getAnho());
        //response.sendRedirect("default.jsp?mensaje="+mensaje+"&anho="+enaho.getAnho());
        request.getRequestDispatcher("login.jsp").forward(request, response);
    }
    
    //Para ver el acceso
    public void home(HttpServletRequest request, HttpServletResponse response) {        
        try {
            String usuario, contrasena;
            usuario = request.getParameter("txtusuario").trim();
            contrasena = request.getParameter("txtcontrasena").trim();
            
            String jsp = null;

            String mensaje = null;
            if (usuario == "" || contrasena == "") {
                //jsp = "default.jsp"; //response.redirect("../default.asp")                
            }
            else {
                UsuarioService service = (UsuarioService) this.getService();
                Usuario uLogin = service.findUsuarioParaAccesoSistema(usuario,contrasena);
         
                
                if(uLogin==null) {
                    mensaje = "Usuario ó Contraseña incorrectos.";
                    //mensaje = URLEncoder.encode("Usuario ó Contraseña incorrectos.", "UTF-8");
                    //jsp = "default.jsp?user=" + usuario + "&mensaje=" + mensaje;
                }
                else {                    
                    if(uLogin.isActivo()) {
                        HttpSession s = request.getSession();
                        
                        //TIEMPO DE LA SESION: tiempo de inactividad que pasa para que se limpie la sesion
                        s.setMaxInactiveInterval(TIEMPO_LIMITE_SESION*60);//10 minutos
                        //s.setMaxInactiveInterval(3*60);//3 minutos
                        //s.setMaxInactiveInterval(2);//2 segundos

                        //Usuario en sesion del cliente
                        SesionEnaho ses = new SesionEnaho(request);
                        //String usuario = uLogin.getIdentificador();
                        ses.setIdentificadorUsuario(usuario);
                        ses.setUsuario(uLogin);

                        /*
                        ses.setNombreUsuario(usuarioAcceso.getPersonal().getNombres());
                        ses.setPerfilUsuario(usuarioAcceso.getPerfil());
                        ses.setDni(usuarioAcceso.getPersonal().getDni());
                        ses.setOdei(usuarioAcceso.getPersonal().getOdei().getCodigo());
                        */ 

                        Usuario uServidor = this.getUsuarioEnSesionDelServidor(ses);
                        uServidor.setNavegadorWeb(JspUtil.getNavegadorWeb(request));
                        uServidor.setFechaLogueo(new Date());//Fecha y hora actual
        
                        jsp = "pagweb/menu/frame2.jsp";
                        //jsp = "../test/sesion.jsp";                      
                    }
                    else { 
                        mensaje = "Usuario desactivado.";                        
                        //jsp = "default.jsp?user=" + usuario + "&mensaje=" + mensaje;
                    }
                }            
            }
            if(jsp==null) {    
                request.setAttribute("user", usuario);
                request.setAttribute("mensaje", mensaje);
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }
            else {                
                response.sendRedirect(jsp);
            }
        }
        catch(Exception e) {
            MiLogger logger = MiLogger.getLogger(response,AppContext.getInstancia().getLoggerContext().getLoggerErrores());
            logger.loge(e);
        }
        
    }
    
       
    public void homeModuloTransferencia(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.sendRedirect("pagweb/menuT/frame.jsp");
    }
    
    //Este usuario es independiente de la sesion HTTP del cliente
    //Guardar los estados del usuario en la sesion del cliente tiene 
    //la desventaja que al cerar sesion se pierden los estados del usuario
    public Usuario getUsuarioEnSesionDelServidor(HttpServletRequest request) {
        SesionEnaho sesion = new SesionEnaho(request);
        return getUsuarioEnSesionDelServidor(sesion);
    }
    
    private Usuario getUsuarioEnSesionDelServidor(SesionEnaho sesion) {
        String identificadorUsuario = sesion.getIdentificadorUsuario();
        
        if(identificadorUsuario==null)
            return null;
        
        UsuarioService service = (UsuarioService) this.getService();
        
        //Usuario uServidor = sesionServidor.get(identificadorUsuario);
        Usuario uServidor = service.findByKey(identificadorUsuario);
        if(uServidor == null) {
            Usuario u = new Usuario();
            u.setIdentificador(identificadorUsuario);
            u.setEstado(EstadoUsuario.SIN_ACTIVIDAD);//esto se debe setear aqui. No en otro lugar
            
            Usuario ua = sesion.getUsuario();
            
            Personal p = new Personal();
            p.setNombres(ua.getPersonal().getNombres());
            u.setPersonal(p);            
            u.setPerfil(ua.getPerfil());            
                    
            uServidor = service.save(u);
            //sesionServidor.put(identificadorUsuario, uServidor);
        }        
        
        //uServidor.setNavegadorWeb(sesion.getNavegadorWeb());
        
        return uServidor;
    }
        
    public void logRequest(HttpServlet httpServlet, HttpServletRequest request, String idController, String action) {
        MiLogger loggerRequest = AppContext.getInstancia().getLoggerContext().getLoggerRequest();
        SesionEnaho ses = new SesionEnaho(request);
        String params = JspUtil.getParametros(request,new String[]{"controller","action","txtcontrasena","txtpassword"});
        if(httpServlet instanceof DispatcherExcelServlet) {
            loggerRequest.log(ses.getIdentificadorUsuario()+"."+idController+"."+action+".EXCEL?"+params);
        }
        else {
            loggerRequest.log(ses.getIdentificadorUsuario()+"."+idController+"."+action+"?"+params);
        }
    }
    
    
    public Accion validarRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String,AbstractController> controllers = AppContext.getInstancia().getControllerMapping().getControllers();
        String idController = (String) request.getParameter("controller");
        String action = (String) request.getParameter("action");           
        AbstractController controller = (AbstractController)controllers.get(idController);
                
        if(controller instanceof UsuarioController 
                    && (action.equals("home") || action.equals("welcome"))) {//si solicita loguearse
            //NO VALIDA
        }
        else {
            //SI VALIDA
            SesionEnaho sesion = new SesionEnaho(request);

            if(sesion.haCaducado()) {
                //response.sendRedirect("pagweb/ver_caducado.jsp");
                throw new UsuarioException("Han pasado m&aacute;s de "+TIEMPO_LIMITE_SESION+" minutos sin actividad del usuario");
            }
            else {                

                if(controller!=null) {
                    if(action!=null) {

                    }
                    else {
                        throw new Exception("No se especificó una accion para el controlador '"+idController+"'");
                    }
                }
                else {
                    if(idController==null)
                        throw new Exception("No se especificó un controlador");
                    else
                        throw new Exception("No existe el controlador '"+idController+"'");
                }            


                if(sesion.esInvalida()) {
                    //response.sendRedirect("pagweb/ver_caducado.jsp");
                    throw new UsuarioException("La sesion es invalida");
                }

                                
            }
        }
        
        Accion accion = new Accion();
        accion.setIdControlador(idController);
        accion.setControlador(controller);            
        accion.setMetodo(action);
        return accion;
    }   
   
       
   

    
    /**
     * 
     * @param perfilEnum Es una opcion del sistema
     * @param request
     * @throws UsuarioException 
     */
    public void verificarPermiso(Opcion perfilEnum, HttpServletRequest request) throws UsuarioException { 
        SesionEnaho ses = new SesionEnaho(request);
        Perfil p = ses.getUsuario().getPerfil();
        if(!p.getOpciones().contiene(perfilEnum)) {
            throw new UsuarioException("Ud. no tiene permisos para ejecutar esta opcion");
        }
    }
    
    /*
    public void verificarPermiso(OpcionReporte perfilEnum, HttpServletRequest request) throws UsuarioException { 
        SesionEnaho ses = new SesionEnaho(request);
        Perfil p = ses.getUsuario().getPerfil();
        if(!p.getOpciones().contiene(perfilEnum)) {
            throw new UsuarioException("Ud. no tiene permisos para ejecutar esta opcion");
        }
    }
    
    public void verificarPermiso(OpcionMonitoreo perfilEnum, HttpServletRequest request) throws UsuarioException { 
        SesionEnaho ses = new SesionEnaho(request);
        Perfil p = ses.getUsuario().getPerfil();
        if(!p.getOpciones().contiene(perfilEnum)) {
            throw new UsuarioException("Ud. no tiene permisos para ejecutar esta opcion");
        }
    }
    */
    


}
